Although commercially available computer programs are generally very reliable, a program can encounter problems that result in a malfunction that causes the program to stop functioning. Such a malfunction is referred to as a “crash.” The problems that can cause a program to crash include hardware errors (e.g., defective memory location), logical errors in the program (e.g., using an invalid memory address), incompatible components (e.g., linking to an outdated function), and so on. When a program crashes, the operating system typically takes control as a result of a hardware or software exception being raised. A hardware exception can be raised for a variety of reasons, including attempted division by zero, use of an invalid memory address, attempted execution of an invalid instruction, and so on. The instruction set architecture of the processor on which the program executes defines different types of exceptions and where control is transferred when each type of exception is raised. The program or the operating system typically installs hardware exception handlers for each type of hardware exception. A software exception, in contrast, is raised by software detecting an unusual situation. For example, a software exception might be raised when a function is passed an invalid parameter, when a C++ exception is not caught, and so on. The program or operating system typically installs software exception handlers for each type of software exception. When an exception is raised, the exception handler for that type of exception is invoked to handle the exception. Each exception handler determines, based on the seriousness of the exception, whether the program should continue its execution or terminate its execution, resulting in a crash.
When a program crashes, the operating system typically collects information about the crash, generates a crash report based on the collected information, and makes the crash report available to the developer of the program that crashed. When a crash handler installed by the operating system is invoked, the crash handler typically executes in a supervisory privilege mode (e.g., supervisor mode or kernel mode) of the processor. Because the crash handler executes in a supervisory privilege mode, the crash handler may have access to all the data structures of the operating system and the data structures of the program that crashed. The access to these data structures allows the crash handler to collect any information it deems appropriate for a crash report. Once a crash report is generated, it can be made available to the developer. For example, the crash report may be transmitted to a crash reporting server where it is made available to the developer.
Although crash reports provided by an operating system provide valuable information to assist a developer in determining the cause of the crash of a program, the information in a crash report is not typically tailored to the program itself or the needs of the developer. Moreover, a crash reporting server may provide generic tools for use by developers of all types of programs. As a result, a developer of a program may not have program-specific tools available that would be helpful in determining the cause of the crash. Also, the operating system may control what crash reports to send and the timing of the sending. A developer may want such control to meet the developer's needs.